/// 功能：计算输入数据的 CRC32C 校验和（32 位无符号整数）。
///
/// 参数 impl AsRef<[u8]> 表示接受任何可转换为字节切片的类型（如 &str、Vec<u8> 等）。
///
/// 内部调用 crc32c 库的 crc32c 函数，直接返回计算结果。
pub(crate) fn crc32(data: impl AsRef<[u8]>) -> u32 {
    crc32c::crc32c(data.as_ref())
}

/// 功能：提供增量式计算 CRC32C 校验和的能力（适用于数据分块传输或生成的场景）。
/// 内部包含 crc32c::Crc32cHasher 类型的 hasher，用于累积计算中间结果。
pub(crate) struct Digest {
    hasher: crc32c::Crc32cHasher,
}

impl Digest {
    /// 向校验和计算中添加一部分数据，更新中间结果（支持多次调用，逐步传入数据）。
    pub fn update(&mut self, data: &[u8]) {
        use std::hash::Hasher;
        self.hasher.write(data);
    }
    /// 完成校验和计算，返回最终的 32 位 CRC32C 结果（会消耗 Digest 实例）。
    pub fn finalize(self) -> u32 {
        use std::hash::Hasher;
        self.hasher.finish() as u32
    }
}

/// 功能：创建一个新的 Digest 实例，用于开始增量式校验和计算。
/// 初始化一个以 0 为起始值的 Crc32cHasher。
pub(crate) fn digest() -> Digest {
    Digest {
        hasher: crc32c::Crc32cHasher::new(0),
    }
}
